package com.redis.springbootredis.rabbitmq.test;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author
 * @create 2020-11-03 19:46
 * 消息属性测试的生产者
 */
public class MessageProducer {

    public static void main(String[] args) throws Exception {
        //创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //设置访问的ip地址
        connectionFactory.setHost("192.168.238.132");
        //设置虚拟主机(类似于redis的db)
        connectionFactory.setVirtualHost("ljw");
        //设置密码和账户
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        //新建连接对象
        Connection connection = connectionFactory.newConnection();
        //创建连接信道(需要通信的话必须创建，类似于输送水的水管)
        Channel channel = connection.createChannel();
        //启用生产者确认监听
        channel.confirmSelect();
        //确认的监听回调(使用监听后不能关闭连接和信道)
        channel.addConfirmListener(new ConfirmListener() {
            @Override
            public void handleAck(long deliveryTag, boolean multiple) throws IOException {
                /*
                  long deliveryTag 信封标记
                  boolean multiple 是否同时回复多个
                */
                System.out.println("ACK---"+multiple);
            }

            @Override
            public void handleNack(long deliveryTag, boolean multiple) throws IOException {
                System.out.println("NACK"+multiple);
            }
        });
        //return消息机制(当往不存在的路由发送消息时触发)
        channel.addReturnListener(new ReturnListener() {
            @Override
            public void handleReturn(int replyCode, String replyText, String exchange, String routingKey, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("replyCode---"+replyCode);
                System.out.println("replyText---"+replyText);
                System.out.println("exchange---"+exchange);
                System.out.println("properties---"+properties);
                System.out.println("body---"+body);
            }
        });
        //创建生产者
        /*
          String exchange  交换机的名字，最简单的模型不需要指定交换机，使用系统默认的即可(但是不能写null)
          String routingKey 路由ID，最简单的模型路由ID就是队列名
          BasicProperties props  附加的消息属性
          byte[] body 消息体，发送的消息内容
          AMQP.BasicProperties 创建消息属性
          data 发送消息时带的参数体
        */
        Map<String, Object> data = new HashMap<>();
        data.put("ljw","abc");
        data.put("fzt","def");
        AMQP.BasicProperties props = new AMQP.BasicProperties().builder()
                //设置消息的生命周期为5秒
//                .expiration("5000")
                //设置消息为持久化，默认值为1，2为持久化
                .deliveryMode(2)
                //设置编码格式
                .contentEncoding("utf-8")
                //设置请求头参数
                .headers(data)
                .build();
        for(int i = 0 ; i < 8 ; i++){
            channel.basicPublish("exchangemessage","message",true,props,("MessageQueue"+i).getBytes());
            System.out.println("发送成功"+i);
        }
        System.out.println("发送成功");
        //生产者发送消息后需要释放资源
//        channel.close();  //关闭信道
//        connection.close(); //关闭连接
    }
}
